fn main() {
	u := u16(12)
	v := 13 + u    // v is of type `u16` - no promotion
	x := f32(45.6)
	y := x + 3.14  // x is of type `f32` - no promotion
	a := 75        // a is of type `int` - default for int literal
	b := 14.7      // b is of type `f64` - default for float literal
	c := u + a     // c is of type `int` - automatic promotion of `u`'s value
	d := b + x     // d is of type `f64` - automatic promotion of `x`'s value
}

// bool

// i8 i16 int i64 i128
// u8 u16 u32 u64 u128
// f32 f64

// string
// rune, represents a Unicode code point

// isize, usize, platform-dependent, the size is how many bytes it takes to reference any location in memory
// voidptr, mostly used for C interoperability
// any, similar to C's void* and Go's interface{}

// int is always a 32 bit integer
// a small primitives type on one side can be automatically promoted if it fits completely into the data range of the type on the other side
